const express = require('express');
const app = express();

const http = require('http').createServer(app);
const fs = require('fs');

let sslOptions = {
    //里面替换成生成的私钥
    key: fs.readFileSync('/home/zhangsnke/private_key/privkey.key'),
    //里面替换生成的证书
    cert: fs.readFileSync('/home/zhangsnke/private_key/cacert.pem')
};



const https = require('https').createServer(sslOptions,app);

const io = require('socket.io')(https);

//express路由 把index.html静态文件send到浏览器上
app.get('/',(req,res)=>{
    res.sendFile(__dirname + '/index.html');
});

app.get('/camera',(req,res)=>{
    res.sendFile(__dirname+"/camera.html");
});

app.get('/video',(req,res)=>{
    res.sendFile(__dirname+"/record.html");
});

//访问静态文件 localhost:3000/static/123.jpg
app.use("/static",express.static("static/"));

io.on("connection", (socket) => {
    //连接加入子房间
    socket.join( socket.id );

    console.log("a user connected " + socket.id);

    socket.on("disconnect", () => {
        console.log("user disconnected: " + socket.id);
        //某个用户断开连接的时候，我们需要告诉所有还在线的用户这个信息
        socket.broadcast.emit('user disconnected', socket.id);
    });

    socket.on("chat message",(msg) => {
        console.log(socket.id + " say: " + msg);
        //io.emit("chat message", msg);
        socket.broadcast.emit("chat message", msg);
    });

    //当有新用户加入，打招呼时，需要转发消息到所有在线用户。
    socket.on('new user greet', (data) => {
        console.log(data);
        console.log(socket.id + ' greet ' + data.msg);
        socket.broadcast.emit('need connect', {sender: socket.id, msg : data.msg});
    });
    //在线用户回应新用户消息的转发
    socket.on('ok we connect', (data) => {
        io.to(data.receiver).emit('ok we connect', {sender : data.sender});
    });

    //sdp 消息的转发
    socket.on( 'sdp', ( data ) => {
        console.log('sdp');
        console.log(data.description);
        //console.log('sdp:  ' + data.sender + '   to:' + data.to);
        socket.to( data.to ).emit( 'sdp', {
            description: data.description,
            sender: data.sender
        } );
    } );

    //candidates 消息的转发
    socket.on( 'ice candidates', ( data ) => {
        console.log('ice candidates:  ');
        console.log(data);
        socket.to( data.to ).emit( 'ice candidates', {
            candidate: data.candidate,
            sender: data.sender
        } );
    } );

});

/*

    1.呼叫者通过 navigator.mediaDevices.getUserMedia() (en-US) 捕捉本地媒体。
    2.呼叫者创建一个RTCPeerConnection 并调用 RTCPeerConnection.addTrack() (注： addStream 已经过时。)
    3.呼叫者调用 ("RTCPeerConnection.createOffer()")来创建一个提议(offer).
    4.呼叫者调用 ("RTCPeerConnection.setLocalDescription()") 将提议(Offer)   设置为本地描述 (即，连接的本地描述).
    5.setLocalDescription()之后, 呼叫者请求 STUN 服务创建ice候选(ice candidates)
    6.呼叫者通过信令服务器将提议(offer)传递至 本次呼叫的预期的接受者.
    7.接受者收到了提议(offer) 并调用 ("RTCPeerConnection.setRemoteDescription()") 将其记录为远程描述 (也就是连接的另一端的描述).
    8.接受者做一些可能需要的步骤结束本次呼叫：捕获本地媒体，然后通过RTCPeerConnection.addTrack()添加到连接中。
    9.接受者通过("RTCPeerConnection.createAnswer()")创建一个应答。
    10.接受者调用 ("RTCPeerConnection.setLocalDescription()") 将应答(answer)   设置为本地描述. 此时，接受者已经获知连接双方的配置了.
    11.接受者通过信令服务器将应答传递到呼叫者.
    12.呼叫者接受到应答.
    13.呼叫者调用 ("RTCPeerConnection.setRemoteDescription()") 将应答设定为远程描述. 如此，呼叫者已经获知连接双方的配置了.


*/

http.listen(3000,()=>{
    console.log('listening on *:3000')
});

https.listen(3001,()=>{
    console.log("https listen on *:3001");
});